package Thread;

import java.util.Scanner;

/**
 * 内存可见性问题
 * 内存可见性问题本质上是编译器/JVM对代码进行优化的时候,优化出bug,如果代码是单线程的,编译器/JVM对代码优化都优化的特别好,优化之后,不会影响到逻辑
 *关键字volatile:避免编译器优化
 */
public class Demo22 {
    private static volatile int n = 0;
    //private static int n = 0;当这里没有volatile的时候,编译器会认为n的值不会变化从而一直在循环中,即使n的值在t2中已经被改变

    public static void main(String[] args){
        Thread t1 = new Thread(() -> {
            while(n == 0){
                //啥都不写

                try{
                    Thread.sleep(10);
                }catch (InterruptedException e){
                    throw new RuntimeException(e);
                }//当加上这段try-catch之后,循环就正常进行了,就是不会对内存进行优化了
            }

            System.out.println("t1线程循环结束");
        });

        Thread t2 = new Thread(() -> {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个整数: ");
            n = scanner.nextInt();
        });

        t1.start();
        t2.start();
    }
}
